package com.itfenghuang.day01;

public class A01_Extends {
    public static void main(String[] args) {
        /**
         *      继承:     extends  已有的类中 派出新的类,  新的类继承原来类的属性和方法,并可以扩展新的功能
         *
         * 1. 概述
         *      案列: Student   属性:  name age gender(性别)   行为: eat  dringk
         *            Teacher   属性:  name age gender(性别)   行为: eat  dringk
         *
         *      开发中:一定要提高代码复用性
         *
         *       继承类的类被称为子类     Student  Teacher
         *          被继承的类称为父类    Person
         *

         *
         * 2.  格式
         *  class A01_Practice  extends C{}  class B  extends C{}
         *
         *  3.练习:
         *          定义猫类 Cat
         *            属性:  name  age  color
         *            行为:  eat  抓老鼠catchMouse
         *          定义猫类 Cat
         *            属性:  name  age  color
         *            行为:  eat  lookhome
         *          使用继承提取出来一个Animal类,共同的特性抽取出来
         *
         *   继承的优缺:
         *          优点:
         *          1.提高了代码的复用性
         *          2.让类和类之间产生了关系,这种关系构成多态的前提
         *
         *          缺点:
         *            类和类之间产生了关系,提高了耦合性
         *                  高内聚,低耦合
         *
         *          特点:
         *              1.java 中,继承只支持单继承,不支持多继承
         *              2. 可以多层继承,不可以循环继承(套娃)
         *
         * 4.在父子类中,类中成员的关系:    属性,功能,构造方法
         *      成员变量名不同   i=2
         *      成员变量名相同  取父类中的值  i=10
         *
         *      成员方法名相同会调用子类中的方法
         *      成员方法名不同会调用父类中的方法
         *
         * 5.方法重写
         *    面试题:  Override(重写) Overload(重载)
         *    重写:  在继承关系下,子类对父类的方法的重新实现,方法名,参数列表,返回值类型都相同,访问修饰符只能扩大或相同
         *    重载:在同一类中,方法名相同,参数列表不同(个数,类型,顺序),与返回值无关
         *
         *  构造方法
         *      创建子类对象的时候,会去调用父类的构造方法,如果自已没有显示声明,
         *      系统会默认添加一个super()  调用父类的空参结构
         *
         * 6. super关键字
         *      其实是一个父类的标识,可以认为是父类对象的引用
         *      可以调用父类中属性
         *
         *      如果在子类中调用父类的成员方法,应该怎么去调用
         *          方法不需要打印
         *
         *super 和 this 的区别
         *     属性: super  调用 父类的属性
         *           this 调用当前类的
         *
         *     方法:  一样
         *     构造方法
         *      this调用构造方法,调用的是本类的构造方法,必须放在有效代码的第一行,
         *      super 调用构造方法,调用的是当前类的父类的构造方法,必须放在有效代码的第一行
         *      所以他两不能共存(仅仅是调用构造方法的时候,调用属性可以共存)
         *
         *  7.继承的注意事项
         *      1.private 修饰的成员变量和成员方法是被子类继承的,但是
         *      因为private 的特殊性,所以不能再子类中访问
         *      2.子类不能去继承父类的构造方法,但是可以使用super关键字去调用
         *
         */

//        测试父子类中构造方法的关系
        Zi zi = new Zi();
        zi.ss();
        zi.sss();

    }

}

class Student extends Person{

}
class Teacher extends Person{

}
//class Person{
//    public String name;
//    public int age;
//    public String gender;
//
//    public void eat(){
//        System.out.println("吃一碗大米");
//    }
//    public void drink(){
//        System.out.println("喝水");
//    }







//父子类中成员关系
class Fu{
    public int i=2;

    public void fang(){
        System.out.println("父测试");
    }
    public Fu() {
        System.out.println("父的构造方法");
    }
    public Fu(int i) {
        this.i = i;
    }
}
class Zi extends  Fu{
    public int i=10;
    public int j=2;
    //检验方法是否重写
    @Override
    public void fang(){
        System.out.println("子测试");
    }

    public Zi(int i, int j) {
        this.i = i;
        this.j = j;
    }
    public Zi() {
//        super();默认
        this(10,20);
        System.out.println("子的构造方法");
    }
    public void ss(){
        System.out.println(super.i);
        System.out.println(this.i);
    }
    public void sss(){
        super.fang();
        this.fang();
    }


}







